[Embulk]columnプラグインを使い任意のカラムを取得する/カラムを並び替える
はじめに
Embulkを使用し、CSVファイルから任意のカラムを選択し、カラムの並び順を変えて出力することをやってみました。その手順について、まとめてみたいと思います。
使用するプラグインについて
Embulkはインストール済みであるものとします。フィルタープラグインの一つであるcolumnプラグインを使用します。以下のコマンドでインストールをします。
$ java -jar embulk.jar gem install embulk-filter-column
カラムの取得、並び替え
取得元となるCSVについて
EmbulkにはサンプルのCSVを作成する機能があります。以下のコマンドでサンプルのCSVを作成します。
java -jar embulk.jar example ./mydata
実行すると「mydata/csv」フォルダ内に「sample_01.csv.gz」という圧縮したサンプルが作成されます。解凍すると以下の様なCSVとなっています。これは今回、取得元となるCSVファイルです(厳密には圧縮ファイルを取得元とします)。
id,account,time,purchase,comment 1,32864,2015-01-27 19:23:49,20150127,embulk 2,14824,2015-01-27 19:01:23,20150127,embulk jruby 3,27559,2015-01-28 02:20:02,20150128,"Embulk ""csv"" parser plugin" 4,11270,2015-01-29 11:54:36,20150129,NULL
カラムの選択、並び替えについて
カラムの選択、並び替えについては、Embulkが使用するプラグインを記載するyamlファイルに記述します。今回は「config.yml」という名前でyamlファイルを作成し、フィルターとしてcolumnプラグインを指定します。
config.yml(フィルターのみ)
(中略) filters: - type: column columns: - {name: time, format: "%Y-%m-%d %H:%M:%S"} - {name: id, type: long} - {name: comment, type: string} - {name: account, type: long} (中略)
フィルターの定義のみを抜粋しました。フィルターの種類として「column」を指定しています(3行目)。そして「columns」要素に取得するカラム名を、任意の並び順で記述します。今回の例では、purchaseカラム以外のカラムをtime・id・comment・accountの並び順で取得しています。
config.ymlにはフィルター以外にも取得元となるファイル名、出力形式などを記述する必要があります。今回作成したものの全体は以下のようになります。
config.yml(全体)
in: type: file path_prefix: ./mydata/csv/sample_01.csv.gz decoders: - {type: gzip} parser: charset: Shift-JIS newline: CRLF type: csv delimiter: ',' quote: '"' escape: '"' skip_header_lines: 1 columns: - {name: id, type: long} - {name: account, type: long} - {name: time, type: string} - {name: purchase, type: string} - {name: comment, type: string} exec: {} filters: - type: column columns: - {name: time, format: "%Y-%m-%d %H:%M:%S"} - {name: id, type: long} - {name: comment, type: string} - {name: account, type: long} out: type: file path_prefix: ./mydata/csv/sample_01 file_ext: csv formatter: type: csv header_line: true delimiter: "," quote: '"' escape: '\' newline: CRLF charset: UTF-8
全項目の詳細な説明はここでは避けますが、エスケープ文字の指定について取得元はダブルクォート(")を指定してし(12行目)、出力先はバックスラッシュ(\)で指定している(37行目)のに注意してください。
取得の実行
以下のコマンドでEmbulkを起動します。
$ java -jar embulk.jar run config.yml
実行すると以下の様なCSVが出力されます。
time,id,comment,account 2015-01-27 19:23:49,1,embulk,32864 2015-01-27 19:01:23,2,embulk jruby,14824 2015-01-28 02:20:02,3,"Embulk \"csv\" parser plugin",27559 2015-01-29 11:54:36,4,NULL,11270
config.ymlで指定した通りのカラム、並び順で出力されていることが分かるかと思います。またエスケープ文字についても、指定した文字に変換されて出力されていることが分かるかと思います。
最後に
今回は紹介しませんでしたが、columnプラグインの説明によるとカラムの追加などもできるようです。カラムの並び替え、追加、削除などが必要な場合はこのプラグインの使用を検討してもいいかもしれません。